import { Bullet } from "./Bullet";
import { AcGameObject } from "./AcGameObject";//基类
import { Cell } from "./Cell";

//注意：本代码，在所有渲染函数之外的地方，，所有宽高长的单位都是L（每一个小格子的长度）,不是像素，
//最后渲染时再*L，变成像素！
//渲染之前全是普通横纵(r,c)坐标，渲染时才变成canvas坐标
export class Tank extends AcGameObject {//坦克的共同祖先

  constructor(r, c,kind,gamemap,store) {//在gamemap这张画布上的(r,c)位置画一个种类为kind的坦克
    super();
    // this.id = id;//这是蛇主人的id；
    this.cell=new Cell(r,c,0.9,0.9);//注意传入的参数(宽高为1，1)
    
    // this.next_cell = new Cell

    this.kind = kind;//"playerA"和"playerB"

    this.store = store;

    this.direction = 0;//初始

    this.status = "idle"; //idle 表示静止 ； move 移动; die 死亡(敌机永远在移动，除非死亡)

    this.gamemap=gamemap;


    this.image = new Image();//画图对象

    this.dr = [-1,0,1,0];//canvas坐标下的变化
    this.dc = [0,1,0,-1];

    this.speed = 3;//每秒移动五个格子


    
    this.coolingtime = 0;//60帧冷却时间

    this.bomb_zheng_count=30;//用于记录坦克爆炸效果的持续时间(暂定0.5s，30帧)；
  }

  set_rc(r,c){//设置位置
    this.cell.r = r;
    this.cell.c = c;
  }
  set_status(status){
    this.status = status;
  }
  set_direction(d){
    this.direction =d;
  }

  is_reach_nextcell(){

  }

  update_move(){//更新每一帧的下一步坐标
      let next_cell = new Cell(this.cell.r+this.dr[this.direction]*this.speed * this.timedelta / 1000,
                              this.cell.c+this.dc[this.direction]*this.speed * this.timedelta / 1000,
                              0.8,0.8);//判断时，把宽高缩小一点，因为canvas画布本来就不精确，否则会导致进不去有些空格

      // console.log(next_cell);                        
      if (this.kind!=="ai" && !this.gamemap.check_valid(next_cell,this.kind)) { //因为对于每个坦克都要判断，所以要写在Enemy.js内
        //这里如果判断下一步不合法，要变回静止状态
        this.status = "idle";//撞了就静止

      }else{
        this.cell = next_cell;
        // console.log(this.direction+",,"+next_cell.r+"#"+next_cell.c);
      }
  }



  bomb_render(){//坦克死后，渲染爆炸效果
    let ctx = this.gamemap.ctx;
    let L = this.gamemap.L;
    this.image.src = require("../images/bomb/bomb.jpg");
    ctx.drawImage(
      this.image,
      this.cell.c*L,//（只对实际坐标画图）转成canvas像素x坐标
      this.cell.r*L,//转成canvas像素y坐标
      this.cell.width*L,
      this.cell.height*L
    );
  }

  attack(){
    if(this.status!=="die" && this.coolingtime>=10){//坦克还活着，且冷却时间超过60帧
          this.gamemap.bullets.push(new Bullet(this,this.gamemap,this.store));//发射子弹
          this.coolingtime=0;//重置冷却时间
    }
  }

  start(){//只执行一次
  }
  update(){//每一帧执行一次 ，除了第一次
    if(this.coolingtime<200)this.coolingtime++;
    //坦克一死，就有爆炸效果，同时bomb_zheng_count逐帧减小，减到0不再展示
    if(this.status==="die" && this.bomb_zheng_count>=0){//爆炸效果只展示30帧
      this.bomb_render();
      this.bomb_zheng_count--;
    }
    if(this.bomb_zheng_count<0)this.destroy();//死了，也爆炸结束了，赶紧销毁吧
    if(this.status==="move"){
      this.update_move();//只要按了，就动，按键松开时，变-1
      // console.log("*");
    }
    if(this.status!=="die"){//子弹和身体，只有活的坦克才能拥有
        this.render();
    }
  }

  render() {//渲染函数，调用draw画出墙
    let ctx = this.gamemap.ctx;
    let L = this.gamemap.L;
    if(this.kind==="playerA")
      switch (this.direction) {
        case 0:
          this.image.src = require("../images/playerA/top.gif");//不知道为什么，这里必须要加require!!我在这卡了一天！！
          break;
        case 1:
          this.image.src = require("../images/playerA/right.gif");
          break;
        case 2:
          this.image.src = require("../images/playerA/bottom.gif");
          break;
        case 3:
          this.image.src = require("../images/playerA/left.gif");
          break;
        default:
          this.image.src = require("../images/playerA/bottom.gif");
      }
    else
    switch (this.direction) {
      case 0:
        this.image.src = require("../images/playerB/top.gif");//不知道为什么，这里必须要加require!!我在这卡了一天！！
        break;
      case 1:
        this.image.src = require("../images/playerB/right.gif");
        break;
      case 2:
        this.image.src = require("../images/playerB/bottom.gif");
        break;
      case 3:
        this.image.src = require("../images/playerB/left.gif");
        break;
      default:
        this.image.src = require("../images/playerB/bottom.gif");
    }

      ctx.drawImage(
        this.image,
        this.cell.c*L,//（只对实际坐标画图）转成canvas像素x坐标
        this.cell.r*L,//转成canvas像素y坐标
        this.cell.width*L,
        this.cell.height*L
      );

  }
}